<?php

namespace addons\shopro\controller;

use addons\epay\library\Service;
use app\admin\model\exchange\Code as LibraryCode;
use app\admin\model\exchange\Goods;
use app\admin\model\exchange\Library;
use app\admin\model\pay\Merchant;
use app\admin\model\share\CommonShare;
use app\common\model\MoneyLog;
use app\common\model\ScoreLog;
use fast\Random;
use think\addons\Controller;
use addons\shopro\exception\Exception;
use addons\shopro\model\Order;
use addons\shopro\model\User;
use app\admin\model\share\ShareUser;
use think\Db;
use think\Log;

class Pay extends Base
{

    protected $noNeedLogin = ['prepay', 'notifyx', 'notifyr', 'alipay','orderPay'];
    protected $noNeedRight = ['*'];


    /**
     * 支付宝网页支付
     */
    public function alipay()
    {
        $order_sn = $this->request->get('order_sn');
        $order = Order::where('order_sn', $order_sn)->find();

        try {
            if (!$order) {
                throw new \Exception("订单不存在");
            }
            if ($order->status > 0) {
                throw new \Exception("订单已支付");
            }
            if ($order->status < 0) {
                throw new \Exception("订单已失效");
            }

            $notify_url = $this->request->root(true) . '/addons/shopro/pay/notifyx/payment/alipay/platform/H5';
            $pay = new \addons\shopro\library\PayService('alipay', 'url', $notify_url);

            $order_data = [
                'out_trade_no' => $order->order_sn,
                'total_fee' => $order->total_fee,
                'subject' => '商城订单支付',
            ];

            $result = $pay->create($order_data);

            $result = $result->getContent();

            echo $result;
        } catch (\Exception $e) {
            echo $e->getMessage();
        }

        // $this->assign('result', $result);

        // return $this->view->fetch();
    }

    /**
     * @return array|void
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @throws \think\exception\PDOException
     *
     */
    public function orderPay(){
        /*$user = User::info();
        if (is_null($user)) {
            // 没有登录，请登录
            $this->error(__('Please login first'), null, 401);
        }*/
        $payment = $this->request->post('payment', 'wallet');//wallet 余额 mutual 互助金
        $is_old = request()->post('is_old',0);//0新资金1老资金2零批收益
        $total_fee = request()->post('total_fee',0);//订单金额
        $order_sn = request()->post('order_sn');
        $mobile = request()->post('mobile');
        $sign = request()->post('sign');
        $key = "DFSFSWERWE110";
        if($sign != md5($mobile.$key)){
            $this->error("签名验证失败");
        }
        $str = "mobile".$mobile."payment".$payment."is_old".$is_old."total_fee".$total_fee."order_sn".$order_sn;
        if (!$payment || !in_array($payment, ['wallet','mutual'])) {
            $str .= "支付类型错误";
            log_print($str);
            $this->error("支付类型错误");
        }
        if(!$mobile){
            $str .= "手机号必传";
            log_print($str);
            $this->error("手机号必传");
        }
        $user_data = Db::name("user")->where(['mobile'=>$mobile])->find();
        if(!$user_data){
            $str .= "手机号不存在";
            log_print($str);
            $this->error("手机号不存在");
        }
        if($total_fee <= 0){
            $str .= "支付费用错误";
            log_print($str);
            $this->error("支付费用错误");
        }
        $mutual_money = Db::name("share_user")->where(['user_id' => $user_data['id']])->value("mutual_money");
        if ($payment == "mutual") {
            if ($mutual_money > 0) {
                if ($mutual_money > $total_fee) {
                    Db::name("share_user")->where(['user_id' => $user_data['id']])->update(['mutual_money' => ($mutual_money - $total_fee)]);
                    User::mutual(-$total_fee, $user_data['id'], 'mutual_pay', '', '', [
                        'order_id' => '',
                        'order_sn' => $order_sn,
                    ], $mutual_money);
                    $str .= "支付成功";
                    log_print($str);
                    $this->success('支付成功');
                } else {
                    $str .= "互助金可用余额不足";
                    log_print($str);
                    $this->error('互助金可用余额不足');
                }
            }else{
                $str .= "互助金可用余额不足";
                log_print($str);
                $this->error('互助金可用余额不足');
            }
        }else{
            $mod = ShareUser::where(['is_delete' => 0, 'user_id' => $user_data['id']])->find();
            $money =$total_fee;
            if ($is_old == 1) {
                if (!$mod || $mod->old_price - $money < 0) {
                    $str .= "可用余额不足";
                    log_print($str);
                    $this->error('可用余额不足');
                    // new Exception('可用余额不足');
                }
            }elseif ($is_old == 2){
                if (!$mod || $mod->lp_price - $money < 0) {
                    $str .= "可用余额不足";
                    log_print($str);
                    $this->error('可用余额不足');
                    // new Exception('可用余额不足');
                }
            } else {
                if (!$mod || $mod->price - $money < 0) {
                    $str .= "可用余额不足";
                    log_print($str);
                    $this->error('可用余额不足');
                    // new Exception('可用余额不足');
                }
            }
            if ($is_old == 1) {
                MoneyLog::create(['user_id' => $user_data['id'], 'money' => $money, 'before' => $mod->old_price, 'after' => $mod->old_price - $money, 'type' => 2, 'memo' => '订单号：' . $order_sn . '订单支付成功', 'is_old' => $is_old]);

                ShareUser::where(['is_delete' => 0, 'user_id' => $user_data['id']])->setDec('old_price', $money);
            }elseif ($is_old == 2){
                MoneyLog::create(['user_id' => $user_data['id'], 'money' => $money, 'before' => $mod->lp_price, 'after' => $mod->lp_price - $money, 'type' => 2, 'memo' => '订单号：' . $order_sn . '订单支付成功', 'is_old' => $is_old]);
                ShareUser::where(['is_delete' => 0, 'user_id' => $user_data['id']])->setDec('lp_price', $money);
            } else {
                MoneyLog::create(['user_id' => $user_data['id'], 'money' => $money, 'before' => $mod->price, 'after' => $mod->price - $money, 'type' => 2, 'memo' => '订单号：' . $order_sn . '订单支付成功', 'is_old' => $is_old]);
                ShareUser::where(['is_delete' => 0, 'user_id' => $user_data['id']])->setDec('price', $money);
            }
        }
        $str .= "成功";
        log_print($str);
        $this->success("成功");
    }

    /**
     * 拉起支付
     */
    public function prepay()
    {
        // checkEnv('yansongda');
        $user = User::info();
        $order_sn = $this->request->post('order_sn');
        $payment = $this->request->post('payment', 'wallet');
        $openid = $this->request->post('openid', '');
        $platform = request()->header('platform');
        $is_old = request()->post('is_old',0);//0新资金1老资金2零批收益3广告收益
        $yg = request()->post('yg') ? request()->post('yg') : 0;
        $yg = 0;
        $order = Order::nopay()->where('order_sn', $order_sn)->find();
        $pay_type = Db::name("config")->where(['name'=>'pay_type'])->find();
        if($is_old != 1){
            if($is_old == 0){
                if(!$pay_type || !in_array(99,explode(',',$pay_type['value']))){
                    $this->error("支付通道已关闭");
                }
            }else{
                if(!$pay_type || !in_array($is_old,explode(',',$pay_type['value']))){
                    $this->error("支付通道已关闭");
                }
            }

        }

        if (!$order) {
            $this->error("订单不存在");
        }

        if (!$payment || !in_array($payment, ['wechat', 'alipay', 'wallet','mutual'])) {
            $this->error("支付类型不能为空");
        }
        if($payment == 'wallet' && $is_old == 0 && $yg){
            $this->error("钱包不能使用互助金");
        }
        Db::name("shopro_order")->where(['id' => $order->id])->update(['is_old' => $is_old]);
        $total_fee = $order->total_fee;
        $mutual_money = Db::name("share_user")->where(['user_id' => $user->id])->value("mutual_money");
        if ($payment == "mutual") {
            if ($mutual_money > 0) {
                if ($mutual_money > $total_fee) {
                    Db::name("share_user")->where(['user_id' => $user->id])->update(['mutual_money' => ($mutual_money - $total_fee)]);
                    User::mutual(-$total_fee, $user->id, 'mutual_pay', $order->id, '', [
                        'order_id' => $order->id,
                        'order_sn' => $order->order_sn,
                        'money_type' => 7,      //支付的时候是7
                    ], $mutual_money);

                    // 支付后流程
                    $notify = [
                        'order_sn' => $order['order_sn'],
                        'transaction_id' => '',
                        'notify_time' => date('Y-m-d H:i:s'),
                        'buyer_email' => $user->id,
                        'pay_fee' => $order->total_fee,
                        'pay_type' => $payment             // 支付方式
                    ];
                    $notify['payment_json'] = json_encode($notify);
                    $order->mutual_amount = $total_fee;
                    $order->paymentProcess($order, $notify);

                    $this->success('支付成功', $order);
                } else {
                    $this->error('互助金可用余额不足');
                    // 先看看余额是否足够
                    $userPrice = Db::name("share_user")->where(['user_id' => $user->id])->value('price');
                    $userOldPrice = Db::name("share_user")->where(['user_id' => $user->id])->value('old_price');
                    $userLpPrice = Db::name("share_user")->where(['user_id' => $user->id])->value('lp_price');
                    if($is_old == 1){
                        $allowMoney = $mutual_money + $userOldPrice;
                    }elseif ($is_old == 2){
                        $allowMoney = $mutual_money + $userLpPrice;
                    }else{
                        $allowMoney = $mutual_money + $userPrice;
                    }
                    if ($allowMoney < $total_fee) {
                        $this->error('可用余额不足');
                    }
                    $total_fee = $total_fee - $mutual_money;
                    Db::name("share_user")->where(['user_id' => $user->id])->update(['mutual_money' => 0]);
                    if($order->is_volume_val == 1){
                        Db::name("shopro_order_item")->where(['order_id' => $order->id])->update(['dispatch_status'=>2]);
                        Db::name("shopro_order")->where(['id' => $order->id])->update(['mutual_amount' => $mutual_money,'pay_type'=>"mutual",'status'=>2]);
                        $library_data = Db::name("exchange_library")->where(['type'=>1])->find();
                        if($library_data){
                            if($order->pay_fee == 399){
                                $this->addLibraryCode($library_data['id'],1);
                            }else{
                                $this->addLibraryCode($library_data['id'],3);
                            }
                        }
                    }else{
                        Db::name("shopro_order")->where(['id' => $order->id])->update(['mutual_amount' => $mutual_money,'pay_type'=>"mutual"]);
                    }

                    User::mutual(-$mutual_money, $user->id, 'mutual_pay', $order->id, '', [
                        'order_id' => $order->id,
                        'order_sn' => $order->order_sn,
                    ], $mutual_money);
                }
            }else{
                $this->error('互助金可用余额不足');
            }
        }
        if ($payment == 'wallet') {
            // 余额支付
            $this->walletPay($order, $payment, $platform, $yg,$is_old);
        }

        $order_data = [
            'out_trade_no' => $order->order_sn,
            'total_fee' => $total_fee,
        ];

        // 微信公众号，小程序支付，必须有 openid
        if ($payment == 'wechat') {
            if (in_array($platform, ['wxOfficialAccount', 'wxMiniProgram'])) {
                if (isset($openid) && $openid) {
                    // 如果传的有 openid
                    $order_data['openid'] = $openid;
                } else {
                    // 没有 openid 默认拿下单人的 openid
                    $oauth = \addons\shopro\model\UserOauth::where([
                        'user_id' => $order->user_id,
                        'provider' => 'Wechat',
                        'platform' => $platform
                    ])->find();

                    $order_data['openid'] = $oauth ? $oauth->openid : '';
                }

                if (empty($order_data['openid'])) {
                    // 缺少 openid
                    return $this->success('缺少 openid', 'no_openid');
                }
            }

            $order_data['body'] = '商城订单支付';
        } else {
            $order_data['subject'] = '商城订单支付';
        }

        $notify_url = $this->request->root(true) . '/addons/shopro/pay/notifyx/payment/' . $payment . '/platform/' . $platform;
        $pay = new \addons\shopro\library\PayService($payment, $platform, $notify_url);

        try {
            $result = $pay->create($order_data);
        } catch (\Yansongda\Pay\Exceptions\Exception $e) {
            $this->error("支付配置错误：" . $e->getMessage());
        }

        if ($platform == 'App') {
            $result = $result->getContent();
        }
        if ($platform == 'H5' && $payment == 'wechat') {
            $result = $result->getContent();
        }

        return $this->success('获取预付款成功', [
            'pay_data' => $result,
            'pay_action' => $pay->method,
        ]);
    }

    // 余额支付
    public function walletPay($order, $type, $method, $yg, $is_old=0)
    {

        $order = Db::transaction(function () use ($order, $type, $method, $yg, $is_old) {
            // 重新加锁读，防止连点问题
            $order = Order::nopay()->where('order_sn', $order->order_sn)->lock(true)->find();
            if (!$order) {
                $this->error("订单已支付");
            }
            $total_fee = $order->total_fee - $order->mutual_amount;

            // 扣除余额
            $user = User::info();

            if (is_null($user)) {
                // 没有登录，请登录
                $this->error(__('Please login first'), null, 401);
            }
            $share_user = ShareUser::where(['user_id' => $user->id])->find();
            if(!$yg) {
                if($is_old == 1){
                    if (!$share_user || $share_user->old_price - $total_fee < 0) {
                        $this->error(__('可用余额不足'));
                    }
                }elseif ($is_old == 2){
                    if (!$share_user || $share_user->lp_price - $total_fee < 0) {
                        $this->error(__('可用余额不足'));
                    }
                }elseif ($is_old == 3){
                    if (!$share_user || $share_user->advert_price - $total_fee < 0) {
                        $this->error(__('可用余额不足'));
                    }
                }else{
                    if (!$share_user || $share_user->price - $total_fee < 0) {
                        $this->error(__('可用余额不足'));
                    }
                }

            }

            //查询可使用互助金
            $pay_mutual_money = 0;
            $mutual_money = $share_user->mutual_money;
            if ($yg && $mutual_money > 0 && 1==2) {//不实用互助金
                if ($mutual_money < $total_fee) {
                    $total_fee = $total_fee - $mutual_money;
                    $dt = (new ShareUser)->ordersPay($order, $total_fee, $is_old);// 新增 去除旧的
                    if($dt['status'] == 1){
                        $this->error(__($dt['mgs']));
                    }
                    // User::money(-$total_fee, $user->id, 'wallet_pay', $order->id, '',[
                    //     'order_id' => $order->id,
                    //     'order_sn' => $order->order_sn,
                    //     'cz_type' => 2,
                    // ]);
                    Db::name("share_user")->where(['user_id' => $user->id])->update(['mutual_money' => 0]);
                    User::mutual(-$mutual_money, $user->id, 'mutual_pay', $order->id, '', [
                        'order_id' => $order->id,
                        'order_sn' => $order->order_sn,
                    ], $mutual_money);
                    $pay_mutual_money = $mutual_money;
                } else {
                    Db::name("share_user")->where(['user_id' => $user->id])->update(['mutual_money' => ($mutual_money - $total_fee)]);
                    User::mutual(-$total_fee, $user->id, 'mutual_pay', $order->id, '', [
                        'order_id' => $order->id,
                        'order_sn' => $order->order_sn,
                    ], $mutual_money);
                    $pay_mutual_money = $total_fee;
                }
            } else {
                $dt = (new ShareUser)->ordersPay($order, $total_fee,$is_old);// 新增 去除旧的
                if($dt['status'] == 1){
                    $this->error(__($dt['mgs']));
                }
                // User::money(-$total_fee, $user->id, 'wallet_pay', $order->id, '',[
                //     'order_id' => $order->id,
                //     'order_sn' => $order->order_sn,
                //     'cz_type' => 2,
                // ]);
            }


            // 支付后流程
            $notify = [
                'order_sn' => $order['order_sn'],
                'transaction_id' => '',
                'notify_time' => date('Y-m-d H:i:s'),
                'buyer_email' => $user->id,
                'pay_fee' => $order->total_fee,
                'pay_type' => 'wallet'             // 支付方式
            ];
            $notify['payment_json'] = json_encode($notify);
            $order->mutual_amount = $pay_mutual_money;
            $order->paymentProcess($order, $notify);

            (new CommonShare())->add_share_order($order->id, $order->goods_id, $order->user_id);
            return $order;
        });
        if($order->is_volume_val == 1){
            $shopro_order = Db::name("shopro_order")->where(['id' => $order->id])->update(['status'=>2]);
            $shopro_order_item = Db::name("shopro_order_item")->where(['order_id' => $order->id])->update(['dispatch_status'=>2]);
            $library_data = Db::name("exchange_library")->where(['type'=>1])->find();
            if($library_data){
                if($order->pay_fee == 399){
                    $this->addLibraryCode($library_data['id'],1);
                }else{
                    $this->addLibraryCode($library_data['id'],3);
                }
            }

        }
        $this->success('支付成功', $order);
    }

    /**
     * 添加券
     */
    public function addLibraryCode($library_id,$num)
    {
        $code_temp = (new LibraryCode)->where(['library_id'=> $library_id, 'status' => 0])->select();
        $Library = (new Library())->get(['id'=>$library_id, 'is_delete' =>0]);
        $share_user =(new ShareUser())->get(['user_id'=>$this->auth->id]); // 用户积分
        $temp_score = bcmul($Library['money'],$num);
        $end_time = date('Y-m-d',strtotime('+'.$Library['end_day'].' day'));
        $goods = (new Goods());
        $goods->name = $this->auth->nickname;
        $goods->mobile = $this->auth->mobile;
        $goods->library_id = $library_id;
        $goods->num = $num;
        $goods->money = $temp_score;
        $goods->remarks = '积分兑换';
        $goods->user_id = $this->auth->id;
        $goods->createtime = time();
        $goods->save();

        $Library->status = 1;
        $Library->save();
        foreach ($code_temp as $key => $value) {
            if ($key < (int)$num) {
                $data = array(
                    'status' => 1,
                    'user_id' =>$this->auth->id,
                    'name' => $this->auth->nickname,
                    'mobile' => $this->auth->mobile,
                    'good_id' =>  $goods->id,
                    'end_time' => $end_time
                );
                (new LibraryCode)->where(['id' =>$value['id']])->update($data);
            }
        }
    }
    /**
     * 支付成功回调
     */
    public function notifyx()
    {
        Log::write('notifyx-comein:');

        $payment = $this->request->param('payment');
        $platform = $this->request->param('platform');

        $pay = new \addons\shopro\library\PayService($payment, $platform);

        $result = $pay->notify(function ($data, $pay) use ($payment, $platform) {
            Log::write('notifyx-result:' . json_encode($data));
            // {    // 微信回调参数
            //     "appid":"wx39cd0799d4567dd0",
            //     "bank_type":"OTHERS",
            //     "cash_fee":"1",
            //     "fee_type":"CNY",
            //     "is_subscribe":"N",
            //     "mch_id":"1481069012",
            //     "nonce_str":"dPpcZ6AzCDU8daNC",
            //     "openid":"oD9ko4x7QMDQPZEuN8V5jtZjie3g",
            //     "out_trade_no":"202010240834057843002700",
            //     "result_code":"SUCCESS",
            //     "return_code":"SUCCESS",
            //     "sign":"3103B6D06F13D2B3959C5B3F7F1FD61C",
            //     "time_end":"20200407102424",
            //     "total_fee":"1",
            //     "trade_type":"JSAPI",
            //     "transaction_id":"4200000479202004070804485027"
            // }

            // {    // 支付宝支付成功回调参数
            //     "gmt_create":"2020-04-10 19:15:00",
            //     "charset":"utf-8",
            //     "seller_email":"xptech@qq.com",
            //     "subject":"\u5546\u57ce\u8ba2\u5355\u652f\u4ed8",
            //     "sign":"AOiYZ1a2mEMOuIbHFCi6V6A0LJ97UMiHsCWgNdSU9dlzKFl15Ts8b0mL\/tN+Hhskl+94S3OUiNTBD3dD0Kv923SqaTWxNdj533PCdo2GDKsZIZgKbavnOvaccSKUdmQRE9KtmePPq9V9lFzEQvdUkKq1M8KAWO5K9LTy2iT2y5CUynpiu\/04GVzsTL9PqY+LDwqj6K+w7MgceWm1BWaFWg27AXIRw7wvsFckr3k9GGajgE2fufhoCYGYtGFbhGOp6ExtqS5RXBuPODOyRhBLpD8mwpOX38Oy0X+R4YQIrOi02dhqwPpvw79YjnvgXY3qZEQ66EdUsrT7EBdcPHK0Gw==",
            //     "buyer_id":"2088902485164146",
            //     "invoice_amount":"0.01",
            //     "notify_id":"2020041000222191501064141414240102",
            //     "fund_bill_list":"[{\"amount\":\"0.01\",\"fundChannel\":\"PCREDIT\"}]",
            //     "notify_type":"trade_status_sync",
            //     "trade_status":"TRADE_SUCCESS",
            //     "receipt_amount":"0.01",
            //     "buyer_pay_amount":"0.01",
            //     "app_id":"2021001114666742",
            //     "sign_type":"RSA2",
            //     "seller_id":"2088721922277739",
            //     "gmt_payment":"2020-04-10 19:15:00",
            //     "notify_time":"2020-04-10 19:15:01",
            //     "version":"1.0",
            //     "out_trade_no":"202007144778322770017000",
            //     "total_amount":"0.01",
            //     "trade_no":"2020041022001464141443020240",
            //     "auth_app_id":"2021001114666742",
            //     "buyer_logon_id":"157***@163.com",
            //     "point_amount":"0.00"
            // }

            // {   // 支付宝退款成功（交易关闭）回调参数
            //     "gmt_create": "2020-08-15 14:48:32",
            //     "charset": "utf-8",
            //     "seller_email": "xptech@qq.com",
            //     "gmt_payment": "2020-08-15 14:48:32",
            //     "notify_time": "2020-08-15 16:11:45",
            //     "subject": "商城订单支付",
            //     "gmt_refund": "2020-08-15 16:11:45.140",
            //     "sign": "b6ArkgzLIRteRL9FMGC6i\/jf6VwFYQbaGDGRx002W+pdmN5q9+O4edZ3ALF74fYaijSl9ksNr0dKdvanu3uYxBTcd\/GIS4N1CWzmCOv6pzgx5rO\/YvGoHLM3Yop0GKKuMxmnNsZ6jhYKEY7SYD3Y0L6PU9ZMdHV7yIiVj+zZmbKzUgK9MPDCEXs+nzpNAiSM8GTqYRSUvKobAK68hswG2k1QIcqr5z+ZmVYa\/nHHkoC9qXt5zwyGi4P+2eOsr6V2PjA3x8qqe7TN5aI1DeoZD5KqHPYYaYF17J2q6YPlgl3WUl1RhE7H86bivB1fIuYEv\/3+JR74WN\/o7krGw1RPHg==",
            //     "out_biz_no": "R202004114414846255015300",
            //     "buyer_id": "2088902485164146",
            //     "version": "1.0",
            //     "notify_id": "2020081500222161145064141453349793",
            //     "notify_type": "trade_status_sync",
            //     "out_trade_no": "202002460317545607015300",
            //     "total_amount": "0.01",
            //     "trade_status": "TRADE_CLOSED",
            //     "refund_fee": "0.01",
            //     "trade_no": "2020081522001464141438570535",
            //     "auth_app_id": "2021001114666742",
            //     "buyer_logon_id": "157***@163.com",
            //     "gmt_close": "2020-08-15 16:11:45",
            //     "app_id": "2021001114666742",
            //     "sign_type": "RSA2",
            //     "seller_id": "2088721922277739"
            // }

            try {
                $out_trade_no = $data['out_trade_no'];
                $out_refund_no = $data['out_biz_no'] ?? '';


                // 判断是否是支付宝退款（支付宝退款成功会通知该接口）
                if ($payment == 'alipay'    // 支付宝支付
                    && $data['notify_type'] == 'trade_status_sync'      // 同步交易状态
                    && $data['trade_status'] == 'TRADE_CLOSED'          // 交易关闭
                    && $out_refund_no                                   // 退款单号
                ) {
                    // 退款回调
                    $this->refundFinish($out_trade_no, $out_refund_no);

                    return $pay->success()->send();
                }


                // 判断支付宝微信是否是支付成功状态，如果不是，直接返回响应
                if ($payment == 'alipay' && $data['trade_status'] != 'TRADE_SUCCESS') {
                    // 不是交易成功的通知，直接返回成功
                    return $pay->success()->send();
                }
                if ($payment == 'wechat' && ($data['result_code'] != 'SUCCESS' || $data['return_code'] != 'SUCCESS')) {
                    // 微信交易未成功，返回 false，让微信再次通知
                    return false;
                }

                // 支付成功流程
                $pay_fee = $payment == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;

                //你可以在此编写订单逻辑
                $order = Order::where('order_sn', $out_trade_no)->find();

                if (!$order || $order->status > 0) {
                    // 订单不存在，或者订单已支付
                    return $pay->success()->send();
                }

                Db::transaction(function () use ($order, $data, $payment, $platform, $pay_fee) {
                    $notify = [
                        'order_sn' => $data['out_trade_no'],
                        'transaction_id' => $payment == 'alipay' ? $data['trade_no'] : $data['transaction_id'],
                        'notify_time' => date('Y-m-d H:i:s', strtotime($data['time_end'])),
                        'buyer_email' => $payment == 'alipay' ? $data['buyer_logon_id'] : $data['openid'],
                        'payment_json' => json_encode($data->all()),
                        'pay_fee' => $pay_fee,
                        'pay_type' => $payment              // 支付方式
                    ];
                    $order->paymentProcess($order, $notify);
                });

                return $pay->success()->send();
            } catch (\Exception $e) {
                Log::write('notifyx-error:' . json_encode($e->getMessage()));
            }
        });

        return $result;
    }


    /**
     * 退款成功回调
     */
    public function notifyr()
    {
        Log::write('notifyreturn-comein:');

        $payment = $this->request->param('payment');
        $platform = $this->request->param('platform');

        $pay = new \addons\shopro\library\PayService($payment, $platform);

        $result = $pay->notifyRefund(function ($data, $pay) use ($payment, $platform) {
            Log::write('notifyr-result:' . json_encode($data));
            try {
                $out_refund_no = $data['out_refund_no'];
                $out_trade_no = $data['out_trade_no'];

                // 退款
                $this->refundFinish($out_trade_no, $out_refund_no);

                return $pay->success()->send();
            } catch (\Exception $e) {
                Log::write('notifyreturn-error:' . json_encode($e->getMessage()));
            }
        });

        return $result;
    }


    private function refundFinish($out_trade_no, $out_refund_no)
    {
        $order = Order::where('order_sn', $out_trade_no)->find();
        $refundLog = \app\admin\model\shopro\order\RefundLog::where('refund_sn', $out_refund_no)->find();

        if (!$order || !$refundLog || $refundLog->status != 0) {
            // 订单不存在，或者订单已退款
            return true;
        }

        $item = \app\admin\model\shopro\order\OrderItem::where('id', $refundLog->order_item_id)->find();

        Db::transaction(function () use ($order, $item, $refundLog) {
            \app\admin\model\shopro\order\Order::refundFinish($order, $item, $refundLog);
        });

        return true;
    }
}
